Idea

Load Packages

pacman::p_load(tidyverse, wdman, jsonlite, rvest, xml2, RSelenium, here, crayon, here, magrittr)
library(RSelenium)
Paket 㤼㸱RSelenium㤼㸲 wurde unter R Version 3.4.3 erstelltWarning message:
In checkMatrixPackageVersion() : Package version inconsistency detected.
TMB was built with Matrix version 1.2.12
Current Matrix version is 1.2.11
Please re-install 'TMB' from source or ask CRAN for a binary version of 'TMB' matching CRAN's 'Matrix' package
rD
$client
  browserName
1      chrome
                                id
1 b44485ef708363f81aefc2e486dde766

$server
Process Handle
command   : C:\Users\Fabio\AppData\Local\Temp\Rtmpq0hjCh\file381c6113789b.bat 
system id : 13812
state     : running
url <- "https://www.idea.int/advanced-search?th=Direct%20Democracy%20Database"
checkboxes1 <- c("t46", "t47", "t48", "t49", "t50")
                                 "//input[@value='",jj ,"'][@type='checkbox']"

Selenium message:unknown error: Element <input type="checkbox" name="questions" data-path="46" value="t46"> is not clickable at point (53, 672). Other element would receive the click: <div id="sliding-popup" class="sliding-popup-bottom" style="height: auto; width: 100%; bottom: 0px;">...</div>
  (Session info: chrome=65.0.3325.146)
  (Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 10.0.16299 x86_64)

Error:   Summary: UnknownError
     Detail: An unknown server-side error occurred while processing the command.
     Further Details: run errorDetails method

Webscraping

library(rvest)

idea_html <- read_html("data/idea.html")

# labels <- idea_html %>% 
#   rvest::html_nodes(".country , .answer-value") %>% 
#   rvest::html_text()
# 
# codes <- idea_html %>% 
#   rvest::html_nodes(".country , .answer-value") %>% 
#   rvest::html_attr("data-nid")
# 
# idea_html %>%
#   rvest::html_nodes(".fixed-header div") %>%
#   rvest::html_text()
# 
# data.frame(labels, codes)
# 9108 / 198

cntry <- idea_html %>% 
  rvest::html_nodes(".country") %>% 
  rvest::html_text() %>% 
  rep(each=46)

codes <- idea_html %>% 
  rvest::html_nodes(".answer-value") %>% 
  rvest::html_attr("data-nid") %>% 
  as.character()

labels <- readxl::read_xls("data/idea.xls") %>% 
  names() %>% 
  .[-1] %>% 
  rep(198)

val_labs <- idea_html %>% 
  rvest::html_nodes(".answer-value") %>% 
  rvest::html_text() 

scrape_dat <- data.frame(labels, val_labs, cntry, codes, stringsAsFactors = F) %>% 
  mutate(val_labs = ifelse(val_labs == "", NA, val_labs)) %>% 
  mutate(urls = paste0("https://www.idea.int/node/", codes))

Web Crawling

Extract Dates


years <- 1776:2018 %>% 
  as.character() %>% 
  paste0(collapse = "|")

# texts <- read_html(scrape_dat$urls[1]) %>% 
#   html_nodes("#block-system-main") %>% 
#   html_text()# 

# test <- scrape_dat %>% 
#   filter(codes %in% c("200518", "226549", "229780", "0")) %>% 
#   .[1:4,] %>% 
#   mutate(urls = ifelse(codes == "0", NA, urls))

scrape_dat %<>% 
  mutate(urls = ifelse(codes == "0", NA, urls))

source("helper_function.R")



length(lastyear)

start <- 1
end <- 9108


year_dat <- scraper_of_the_year(scrape_dat, start, end) 

scraperei <- cbind(scrape_dat, year_dat)

save(scraperei, file = "data/scraperei.Rdata")
# 
# str_extract_all("hello this is one date 1999, this wouldn't be a date 3456 but this is one 1890", years)

Take a look

load("data/scraperei.Rdata")

scraperei %>% 
  filter(nyears == 2 & firstyear == lastyear) %>% 
  arrange(desc(nyears))

scraperei %>% 
  filter(nyears == 1) %>% 
  arrange(desc(nyears))

scraperei %>% 
  drop_na(firstyear)

Sudd Data

Load Packages

pacman::p_load(tidyverse, wdman, jsonlite, rvest, xml2, RSelenium, here, crayon, here, magrittr, sjmisc)

Webscraping

library(rvest)
ref_name <- read_html("data/sudd.html") %>% 
urls <- read_html("data/sudd.html") %>% 
  html_nodes(".leer a") %>% 
  html_attr("href")
dates <- read_html("data/sudd.html") %>% 
  html_nodes(".leer:nth-child(3)") %>% 
  html_text()
scrape_sudd <- data.frame(cntry, dates, ref_name, urls, stringsAsFactors = F)
read_html("data/sudd.html") %>% 
  html_nodes("td") %>% 
  html_table()
Error: html_name(x) == "table" is not TRUE

Webcrawling

start <- 1
end <- 2813
source("helper_function.R")
sudd_dat <- scraper_of_the_dats(scrape_sudd, start, end) %>%
  bind_rows()

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=nl012018 of Country: Niederlande

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch012018 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch022018 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec012018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec022018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec032018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec042018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec052018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec062018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec072018 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=au012017 of Country: Australien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=it012017 of Country: Lombardei (Italien)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=br012017 of Country: Südbrasilien (Paraná, Santa Catarina, Rio Grande do Sul)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=es012017 of Country: Katalonien (Spanien)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=iq012017 of Country: Irakisch-Kurdistan (Irak)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=si012017 of Country: Slowenien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch062017 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch072017 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=cl012017 of Country: Osterinsel (Rapa Nui, Isla de Pascua), Chile

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=cl032017 of Country: Osterinsel (Rapa Nui, Isla de Pascua), Chile

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=mr012017 of Country: Mauretanien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ve012017 of Country: Venezuela

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ve022017 of Country: Venezuela

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ve032017 of Country: Venezuela

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=pr012017 of Country: Puerto Rico

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch042017 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ge012017 of Country: Südossetien (Georgien)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=hk012017 of Country: Hongkong

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=fm012017 of Country: Mikronesischer Staatenbund

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az012017 of Country: Berg-Karabach (Aserbaidschan)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ec012017 of Country: Ecuador

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch012017 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch032017 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=kg012016 of Country: Kirgisistan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=it022016 of Country: Italien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch132016 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd012016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd022016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd042016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd052016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd062016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=gd072016 of Country: Grenada

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=bg012016 of Country: Bulgarien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=bg032016 of Country: Bulgarien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ci012016 of Country: Elfenbeinküste

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=hu012016 of Country: Ungarn

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=co012016 of Country: Kolumbien

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=br012016 of Country: Südbrasilien (Paraná, Santa Catarina, Rio Grande do Sul)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az022016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az032016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az042016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az052016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az062016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az072016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az092016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az102016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az122016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az132016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az142016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az152016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az162016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az172016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az182016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az192016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az202016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az212016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az222016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az232016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az242016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az252016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az262016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az272016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az282016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=az292016 of Country: Aserbaidschan

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch102016 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ch112016 of Country: Schweiz

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=ba012016 of Country: Republika Srpska (Bosnien-Herzegowina)

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=li012016 of Country: Liechtenstein

 Checking URL: #: https://www.sudd.ch/event.php?lang=de&id=zm012016 of Country: Sambia


Take a look

Test it

LS0tDQp0aXRsZTogIldlYnNjcmFwZXJlaSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQogIA0KIyBJZGVhDQogIA0KIyMgTG9hZCBQYWNrYWdlcw0KICANCmBgYHtyfQ0KcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCB3ZG1hbiwganNvbmxpdGUsIHJ2ZXN0LCB4bWwyLCBSU2VsZW5pdW0sIGhlcmUsIGNyYXlvbiwgaGVyZSwgbWFncml0dHIpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoUlNlbGVuaXVtKQ0KDQpwb3J0IDwtIHNhbXBsZSg0MDAwTDo1MDAwTCwgMSkNCnJEIDwtIHJzRHJpdmVyKHZlcmJvc2UgPSBGQUxTRSwgcG9ydCA9IHBvcnQpDQpyRA0KDQpyZW1EciA8LSByRCRjbGllbnQNCg0KDQp1cmwgPC0gImh0dHBzOi8vd3d3LmlkZWEuaW50L2FkdmFuY2VkLXNlYXJjaD90aD1EaXJlY3QlMjBEZW1vY3JhY3klMjBEYXRhYmFzZSINCnJlbURyJG5hdmlnYXRlKHVybCkNCg0KY2hlY2tib3hlczEgPC0gYygidDQ2IiwgInQ0NyIsICJ0NDgiLCAidDQ5IiwgInQ1MCIpDQoNCmZvciAoamogaW4gY2hlY2tib3hlczEpIHsNCiAgd2ViRWxlbSA8LSByZW1EciRmaW5kRWxlbWVudCh1c2luZyA9ICd4cGF0aCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICAgICAgIi8vaW5wdXRbQHZhbHVlPSciLGpqICwiJ11bQHR5cGU9J2NoZWNrYm94J10iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICApDQogIA0KICB3ZWJFbGVtJGNsaWNrRWxlbWVudCgpDQp9DQoNCmNoZWNrYm94ZXMyIDwtIGMoImFmcmljYSIsICJhbWVyaWNhcyIsICJhc2lhIiwgImV1cm9wZSIsICJvY2VhbmlhIikNCg0KZm9yIChqaiBpbiBjaGVja2JveGVzMikgew0KICB3ZWJFbGVtIDwtIHJlbURyJGZpbmRFbGVtZW50KHVzaW5nID0gJ3hwYXRoJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXN0ZTAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy9pbnB1dFtAdmFsdWU9JyIsamogLCInXVtAdHlwZT0nY2hlY2tib3gnXSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICkNCiAgDQogIHdlYkVsZW0kY2xpY2tFbGVtZW50KCkgIA0KICANCn0NCg0KDQoNCndlYkVsZW0gPC0gcmVtRHIkZmluZEVsZW1lbnQodXNpbmcgPSAnY3NzJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0iI3N1Ym1pdC1hc3Npc3RlZC1zZWFyY2giKQ0KDQp3ZWJFbGVtJGNsaWNrRWxlbWVudCgpDQpgYGANCg0KIyMgV2Vic2NyYXBpbmcNCg0KYGBge3J9DQpsaWJyYXJ5KHJ2ZXN0KQ0KDQppZGVhX2h0bWwgPC0gcmVhZF9odG1sKCJkYXRhL2lkZWEuaHRtbCIpDQoNCiMgbGFiZWxzIDwtIGlkZWFfaHRtbCAlPiUgDQojICAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5jb3VudHJ5ICwgLmFuc3dlci12YWx1ZSIpICU+JSANCiMgICBydmVzdDo6aHRtbF90ZXh0KCkNCiMgDQojIGNvZGVzIDwtIGlkZWFfaHRtbCAlPiUgDQojICAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5jb3VudHJ5ICwgLmFuc3dlci12YWx1ZSIpICU+JSANCiMgICBydmVzdDo6aHRtbF9hdHRyKCJkYXRhLW5pZCIpDQojIA0KIyBpZGVhX2h0bWwgJT4lDQojICAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5maXhlZC1oZWFkZXIgZGl2IikgJT4lDQojICAgcnZlc3Q6Omh0bWxfdGV4dCgpDQojIA0KIyBkYXRhLmZyYW1lKGxhYmVscywgY29kZXMpDQojIDkxMDggLyAxOTgNCg0KY250cnkgPC0gaWRlYV9odG1sICU+JSANCiAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5jb3VudHJ5IikgJT4lIA0KICBydmVzdDo6aHRtbF90ZXh0KCkgJT4lIA0KICByZXAoZWFjaD00NikNCg0KY29kZXMgPC0gaWRlYV9odG1sICU+JSANCiAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5hbnN3ZXItdmFsdWUiKSAlPiUgDQogIHJ2ZXN0OjpodG1sX2F0dHIoImRhdGEtbmlkIikgJT4lIA0KICBhcy5jaGFyYWN0ZXIoKQ0KDQpsYWJlbHMgPC0gcmVhZHhsOjpyZWFkX3hscygiZGF0YS9pZGVhLnhscyIpICU+JSANCiAgbmFtZXMoKSAlPiUgDQogIC5bLTFdICU+JSANCiAgcmVwKDE5OCkNCg0KdmFsX2xhYnMgPC0gaWRlYV9odG1sICU+JSANCiAgcnZlc3Q6Omh0bWxfbm9kZXMoIi5hbnN3ZXItdmFsdWUiKSAlPiUgDQogIHJ2ZXN0OjpodG1sX3RleHQoKSANCg0Kc2NyYXBlX2RhdCA8LSBkYXRhLmZyYW1lKGxhYmVscywgdmFsX2xhYnMsIGNudHJ5LCBjb2Rlcywgc3RyaW5nc0FzRmFjdG9ycyA9IEYpICU+JSANCiAgbXV0YXRlKHZhbF9sYWJzID0gaWZlbHNlKHZhbF9sYWJzID09ICIiLCBOQSwgdmFsX2xhYnMpKSAlPiUgDQogIG11dGF0ZSh1cmxzID0gcGFzdGUwKCJodHRwczovL3d3dy5pZGVhLmludC9ub2RlLyIsIGNvZGVzKSkNCg0KDQoNCmBgYA0KDQojIyBXZWIgQ3Jhd2xpbmcNCg0KIyMjIEV4dHJhY3QgRGF0ZXMNCg0KYGBge3J9DQoNCnllYXJzIDwtIDE3NzY6MjAxOCAlPiUgDQogIGFzLmNoYXJhY3RlcigpICU+JSANCiAgcGFzdGUwKGNvbGxhcHNlID0gInwiKQ0KDQojIHRleHRzIDwtIHJlYWRfaHRtbChzY3JhcGVfZGF0JHVybHNbMV0pICU+JSANCiMgICBodG1sX25vZGVzKCIjYmxvY2stc3lzdGVtLW1haW4iKSAlPiUgDQojICAgaHRtbF90ZXh0KCkjIA0KDQojIHRlc3QgPC0gc2NyYXBlX2RhdCAlPiUgDQojICAgZmlsdGVyKGNvZGVzICVpbiUgYygiMjAwNTE4IiwgIjIyNjU0OSIsICIyMjk3ODAiLCAiMCIpKSAlPiUgDQojICAgLlsxOjQsXSAlPiUgDQojICAgbXV0YXRlKHVybHMgPSBpZmVsc2UoY29kZXMgPT0gIjAiLCBOQSwgdXJscykpDQoNCnNjcmFwZV9kYXQgJTw+JSANCiAgbXV0YXRlKHVybHMgPSBpZmVsc2UoY29kZXMgPT0gIjAiLCBOQSwgdXJscykpDQoNCnNvdXJjZSgiaGVscGVyX2Z1bmN0aW9uLlIiKQ0KDQoNCg0KbGVuZ3RoKGxhc3R5ZWFyKQ0KDQpzdGFydCA8LSAxDQplbmQgPC0gOTEwOA0KDQoNCnllYXJfZGF0IDwtIHNjcmFwZXJfb2ZfdGhlX3llYXIoc2NyYXBlX2RhdCwgc3RhcnQsIGVuZCkgDQoNCnNjcmFwZXJlaSA8LSBjYmluZChzY3JhcGVfZGF0LCB5ZWFyX2RhdCkNCg0Kc2F2ZShzY3JhcGVyZWksIGZpbGUgPSAiZGF0YS9zY3JhcGVyZWkuUmRhdGEiKQ0KIyANCiMgc3RyX2V4dHJhY3RfYWxsKCJoZWxsbyB0aGlzIGlzIG9uZSBkYXRlIDE5OTksIHRoaXMgd291bGRuJ3QgYmUgYSBkYXRlIDM0NTYgYnV0IHRoaXMgaXMgb25lIDE4OTAiLCB5ZWFycykNCg0KDQoNCmBgYA0KDQoNCiMjIFRha2UgYSBsb29rDQoNCg0KYGBge3J9DQpsb2FkKCJkYXRhL3NjcmFwZXJlaS5SZGF0YSIpDQoNCnNjcmFwZXJlaSAlPiUgDQogIGZpbHRlcihueWVhcnMgPT0gMiAmIGZpcnN0eWVhciA9PSBsYXN0eWVhcikgJT4lIA0KICBhcnJhbmdlKGRlc2MobnllYXJzKSkNCg0Kc2NyYXBlcmVpICU+JSANCiAgZmlsdGVyKG55ZWFycyA9PSAxKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhueWVhcnMpKQ0KDQpzY3JhcGVyZWkgJT4lIA0KICBkcm9wX25hKGZpcnN0eWVhcikNCmBgYA0KDQojIFN1ZGQgRGF0YQ0KDQojIyBMb2FkIFBhY2thZ2VzDQoNCmBgYHtyfQ0KcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCB3ZG1hbiwganNvbmxpdGUsIHJ2ZXN0LCB4bWwyLCBSU2VsZW5pdW0sIGhlcmUsIGNyYXlvbiwgaGVyZSwgbWFncml0dHIsIHNqbWlzYykNCg0KYGBgDQoNCiMjIFdlYnNjcmFwaW5nDQoNCmBgYHtyfQ0KbGlicmFyeShydmVzdCkNCg0KDQpyZWZfbmFtZSA8LSByZWFkX2h0bWwoImRhdGEvc3VkZC5odG1sIikgJT4lIA0KICBodG1sX25vZGVzKCIubGVlciBhIikgJT4lIA0KICBodG1sX3RleHQoKQ0KDQp1cmxzIDwtIHJlYWRfaHRtbCgiZGF0YS9zdWRkLmh0bWwiKSAlPiUgDQogIGh0bWxfbm9kZXMoIi5sZWVyIGEiKSAlPiUgDQogIGh0bWxfYXR0cigiaHJlZiIpDQoNCmRhdGVzIDwtIHJlYWRfaHRtbCgiZGF0YS9zdWRkLmh0bWwiKSAlPiUgDQogIGh0bWxfbm9kZXMoIi5sZWVyOm50aC1jaGlsZCgzKSIpICU+JSANCiAgaHRtbF90ZXh0KCkNCg0KY250cnkgPC0gcmVhZF9odG1sKCJkYXRhL3N1ZGQuaHRtbCIpICU+JSANCiAgaHRtbF9ub2RlcygiLmxlZXI6bnRoLWNoaWxkKDIpIikgJT4lIA0KICBodG1sX3RleHQoKQ0KDQpzY3JhcGVfc3VkZCA8LSBkYXRhLmZyYW1lKGNudHJ5LCBkYXRlcywgcmVmX25hbWUsIHVybHMsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQ0KDQpyZWFkX2h0bWwoImRhdGEvc3VkZC5odG1sIikgJT4lIA0KICBodG1sX25vZGVzKCJ0ZCIpICU+JSANCiAgaHRtbF90YWJsZSgpDQoNCnNvdXJjZSgiaGVscGVyX2Z1bmN0aW9uLlIiKQ0KDQp0YWJsZXN0eWxlIDwtIHJlYWRfaHRtbCgiaHR0cHM6Ly93d3cuc3VkZC5jaC9ldmVudC5waHA/bGFuZz1kZSZpZD1ubDAxMjAxOCIpICU+JSANCiAgaHRtbF9ub2RlcygidGFibGUiKSAlPiUgDQogIGh0bWxfdGFibGUoKSAlPiUgDQogIC5bWzFdXSAlPiUgDQogIGRwbHlyOjptdXRhdGVfYWxsKGZpeF90aGVfc3RyaW5nKQ0KDQpyb3duYW1lcyh0YWJsZXN0eWxlKSA8LSB0YWJsZXN0eWxlJFgxDQoNCnRhYmxlc3R5bGUgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1YMSwgLVgzKSAlPiUgDQogIHQoKSAlPiUgDQogIGFzX3RpYmJsZSgpICU+JSANCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKQ0KDQpgYGANCg0KIyMgV2ViY3Jhd2xpbmcNCg0KYGBge3J9DQoNCg0Kc2V0LnNlZWQoMjAxOCkNCg0KIyB0ZXN0IDwtIHNjcmFwZV9zdWRkICU+JSANCiMgICBzYW1wbGVfbigyMDApDQoNCnN0YXJ0IDwtIDENCmVuZCA8LSAyODEzDQpzb3VyY2UoImhlbHBlcl9mdW5jdGlvbi5SIikNCnN1ZGRfZGF0IDwtIHNjcmFwZXJfb2ZfdGhlX2RhdHMoc2NyYXBlX3N1ZGQsIHN0YXJ0LCBlbmQpICU+JQ0KICBiaW5kX3Jvd3MoKQ0KDQpoZWFkKG5hbWVzKHN1ZGRfZGF0KSwgNDApDQoNCnNhdmUoc3VkZF9kYXQsIGZpbGUgPSAiZGF0YS9zdWRkX2RhdC5SZGF0YSIpDQoNCiMgc3VkZF9kYXRbLDE6MjVdDQojIA0KIyBzZWxlY3RvciA8LSBmdW5jdGlvbih2YXJpYWJsZXMpIHsNCiMgIHNzIDwtIGRhdGEuZnJhbWUodGFibGUodmFyaWFibGVzKSkNCiMgDQojICBzcyRGcmVxWzJdDQojIH0NCiMgDQojIGxvYWQoImRhdGEvc3VkZF9kYXQuUmRhdGEiKQ0KIyANCiMgZGV0ZWN0ZXIgPC0gc3VkZF9kYXQgJT4lDQojICAgbXV0YXRlX2FsbChpcy5uYSkgJT4lDQojICAgbXV0YXRlX2FsbChzZWxlY3RvcikgJT4lDQojICAgLlsxLF0gJT4lDQojICAgdCgpICU+JQ0KIyAgIGFzLmRhdGEuZnJhbWUoKQ0KIyANCiMgdmFyc19leCA8LSBkZXRlY3RlciAlPiUNCiMgICBtdXRhdGUodmFyX25hbWVzID0gcm93bmFtZXMoZGV0ZWN0ZXIpKSAlPiUNCiMgICBmaWx0ZXIoVjEgPCAxMDAwKSAlPiUNCiMgICBzZWxlY3QodmFyX25hbWVzKQ0KIyANCiMgc3VkZF9kYXQgPC0gc3VkZF9kYXQgJT4lDQojICAgc2VsZWN0KHZhcnNfZXgkdmFyX25hbWVzKQ0KDQpzdWRkX2RhdCAlPD4lIA0KICBzZWxlY3QoMTozMCkNCmBgYA0KDQojIyMjIFRha2UgYSBsb29rDQoNCmBgYHtyfQ0KbG9hZCgiZGF0YS9zdWRkX2RhdC5SZGF0YSIpDQoNCiMgeWVhcnMgPC0gMTc3NjoyMDE4ICU+JSANCiMgICBhcy5jaGFyYWN0ZXIoKSAlPiUgDQojICAgcGFzdGUwKGNvbGxhcHNlID0gInwiKQ0KIyANCiMgc3VkZF9kYXQgJTw+JSANCiMgICBtdXRhdGUoZGF0ZSA9IHN0cl9leHRyYWN0KGRhdHVtLCB5ZWFycykpICU+JSANCiMgICBncm91cF9ieShnZWJpZXQsIGRhdGUpICU+JSANCiMgICB0YWxseSgpICU+JSANCiMgICBtdXRhdGUoZGF0ZSA9IGFzLm51bWVyaWMoZGF0ZSkpIA0KIyANCiMgDQojIHN1ZGRfZGF0ICU+JSANCiMgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCBuLCBjb2xvdXIgPSBnZWJpZXQpKSArDQojICAgZ2VvbV9saW5lKCkgKw0KIyAgIGd1aWRlcyhjb2xvdXIgPSBGKQ0KIyANCiMgc3VkZF9kYXQgJT4lIA0KIyAgIGdyb3VwX2J5KGdlYmlldCkgJT4lIA0KIyAgIG11dGF0ZShjdW1uID0gY3Vtc3VtKG4pKSAlPiUgDQojICAgZmlsdGVyKGdlYmlldCAhPSAiU2Nod2VpeiIpICU+JSANCiMgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCBjdW1uLCBjb2xvdXIgPSBnZWJpZXQpKSArDQojICAgZ2VvbV9saW5lKCkgKw0KIyAgIGd1aWRlcyhjb2xvdXIgPSBGKQ0KDQpzdWRkX2RhdCAlPD4lIA0KICBtdXRhdGUocmVzdWx0cyA9IGNhc2Vfd2hlbigNCiAgICBzdHJpbmdyOjpzdHJfZGV0ZWN0KGVyZ2VibmlzLCAidmVyd29yZmVuIikgfiAidW5zdWNjZXNzZnVsIiwNCiAgICBzdHJpbmdyOjpzdHJfZGV0ZWN0KGVyZ2VibmlzLCAia2VpbmUgT3B0aW9uIGFuZ2Vub21tZW4iKSB+ICJ1bnN1Y2Nlc3NmdWwiLA0KICAgIHN0cmluZ3I6OnN0cl9kZXRlY3QoZXJnZWJuaXMsICJhbmdlbm9tbWVuIikgfiAic3VjY2Vzc2Z1bCIsICAgDQogICAgc3RyaW5ncjo6c3RyX2RldGVjdChlcmdlYm5pcywgImtlaW5lIE1laHJoZWl0IikgfiAidW5zdWNjZXNzZnVsIiwNCiAgICBzdHJpbmdyOjpzdHJfZGV0ZWN0KGVyZ2VibmlzLCAia2Fzc2llcnQiKSB+ICJ1bnN1Y2Nlc3NmdWwiLA0KICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICkpICU+JSANCiAgbXV0YXRlKHN1Y2Nlc3MgPSBpZmVsc2UocmVzdWx0cyA9PSAic3VjY2Vzc2Z1bCIsIDEsIDApKQ0KDQojZHB1dCh1bmlxdWUoc3VkZF9kYXQkcmVzdWx0cykpDQoNCnRhYmxlKHN1ZGRfZGF0JHN1Y2Nlc3MpDQoNCnN1ZGRfZGF0ICU8PiUgDQogIG11dGF0ZShwYXJ0aWNpcGF0aW9uID0gc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKHN0aW1tYmV0ZWlsaWd1bmcsICInIiwgIiIpKSAlPiUgDQogIG11dGF0ZShwYXJ0aWNpcGF0aW9uID0gaWZlbHNlKHBhcnRpY2lwYXRpb24gPT0gIi0tLSIsIE5BX2NoYXJhY3Rlcl8sIHBhcnRpY2lwYXRpb24pICU+JSANCiAgICAgICAgICAgYXMubnVtZXJpYygpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9wZWVwcyA9IHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChzdGltbWJlcmVjaHRpZ3RlLCAiJyIsICIiKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcGVlcHMgPSBpZmVsc2UodG90YWxfcGVlcHMgPT0gIi0tLSIsIE5BX2NoYXJhY3Rlcl8sIHRvdGFsX3BlZXBzKSAlPiUgDQogICAgICAgICAgIGFzLm51bWVyaWMoKSkgJT4lIA0KICBtdXRhdGUocmF0aW8gPSBwYXJ0aWNpcGF0aW9uL3RvdGFsX3BlZXBzKSAlPiUgDQogIGZpbHRlcihnZWJpZXQgIT0gIk1hZ2hyZWJpbmllbiIpDQoNCg0KZml0MSA8LSBnbG0oc3VjY2VzcyB+IHJhdGlvLCBkYXRhID0gc3VkZF9kYXQpDQoNCnNqUGxvdDo6cGxvdF9tb2RlbChmaXQxLCB0eXBlID0gImVmZiIsIHRlcm1zID0gInJhdGlvIikNCg0Kc2pQbG90OjpzanAuZ2xtKGZpdDEsIHR5cGUgPSAiZG90cyIpDQoNCnN1ZGRfZGF0ICU+JSANCiAgY2JpbmQoZGF0YS5mcmFtZShmaXR0ZWQgPSBwcmVkaWN0KGZpdDEsIHN1ZGRfZGF0KSkpICU+JSANCiAgZmlsdGVyKGZpdHRlZCA+IDEpDQoNCm1heChzdWRkX2RhdCRmaXR0ZWQsIG5hLnJtID0gVCkNCg0Kc3VkZF9kYXQgJT4lIA0KICAgZ2dwbG90KGFlcyhyYXRpbywgZml0dGVkKSkgKw0KICAgZ2VvbV9zbW9vdGgoKQ0KDQpzdWRkX2RhdCAlPiUgDQogIGZpbHRlcihyYXRpbyA8IDAuMikNCg0Kc3VkZF9kYXQgJT4lIA0KIyAgc2VsZWN0KHN0ZWxsdW5nKSAlPiUgDQogICMgQlkgV0hPTT8hDQogIG11dGF0ZShlbnRpdHkgPSBjYXNlX3doZW4oDQogICAgc3RlbGx1bmcgPT0gInVuYWJoYWVuZ2lnZXIgU3RhYXQiIH4gImluZGVwZW5kZW50IiwNCiAgICBUUlVFIH4gImRlcGVuZGVudCINCiAgKSkgJT4lICAgDQogIG11dGF0ZShib3R0b21fdXAgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFZvbGsiKSB+ICIxIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggUGFybGFtZW50IikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFN0YWF0c3JhdCIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBQYXJsYW1lbnRzbWluZGVyaGVpdCIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBSZWdpb25hbHJhZXRlIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFNlbmF0c21pbmRlcmhlaXQiKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggUmVnaWVydW5nIGRlcyBNdXR0ZXJsYW5kcyIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBWZXJmYXNzdW5nc3JhdCIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBHZW1laW5kZW4iKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggR2VtZWluZGVyYWV0ZSIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBQcmFlc2lkZW50IikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFJlZ2llcnVuZyIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBFeGVrdXRpdmUiKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggRW1pciIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBDXDAzNGJlcmdhbmdzcGFybGFtZW50IikgfiAiMCIsICAgIA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBHb3V2ZXJuZXVyIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIEZyYW5rcmVpY2gvQlJEIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIEdlbmVyYWxnb3V2ZXJuZXVyIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIEthaXNlciIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBLQzZuaWciKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggWmVudHJhbGJlaEM2cmRlbiIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBBZG1pbmlzdHJhdG9yIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIEZ1ZXJzdCIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBLb2xvbmlhbGJlaEM2cmRlbiIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBNaWxpdGFlcnJhdCIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBMb2thbHJlZ2llcnVuZyIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBNaWxpdGFlcnJlZ2llcnVuZyIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBSZWdlbnoiKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggUmVnZW50IikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFNjaGFoIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFN1bHRhbiIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBVUy1SZWdpZXJ1bmciKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggVU5PIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFdhaGxiZWhDNnJkZSIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBLb25zdWwiKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggTWluaXN0ZXJpdW0iKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggSW5zZWxyYXQiKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggTm90YWJsZW52ZXJzYW1tbHVuZyIpIH4gIjAiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJkdXJjaCBTdGFhdHNwcmFlc2lkZW50IikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFN0YWR0cmVnaWVydW5nIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFZDNmxrZXJidW5kIikgfiAiMCIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImR1cmNoIFZlcndhbHR1bmciKSB+ICIwIiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiZHVyY2ggTWluaXN0ZXJwcmFlc2lkZW50IikgfiAiMCIsDQogICAgVFJVRSB+IGFic3RpbW11bmdzdHlwDQogICkpIA0KDQoNCnN1ZGRfZGF0ICU+JSANCiAgIyBXaGF0IGlzIGJlaW5nIGRlY2lkZWQ/DQogIG11dGF0ZShsZXZlbCA9IGlmZWxzZShzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiU3R1ZmU6IiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2V4dHJhY3QoYWJzdGltbXVuZ3N0eXAsICJTdHVmZTouKiQiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZW1vdmUoLiwgIlN0dWZlOiAiKSwgTkEpKSAjJT4lICN0aGVyZSBpcyBhIGZldyBOQSB0aGF0IG5lZWQgdG8gYmUgZml4ZWQNCiAgIyBzZWxlY3QobGV2ZWwpICU+JSANCiAgIyB0YWJsZSgpDQoNCnN1ZGRfZGF0ICU+JSANCiAgICAjIEJpbmRpbmduZXNzPw0KICBtdXRhdGUoYmluZGluZ25lc3MgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgIm5pY2h0IGJpbmRlbmQiKSB+ICJub24tYmluZGluZyIsDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImplIG5hY2ggU3RpbW12ZXJoYWx0ZW4gYmluZGVuZCIpIH4gInNvbWV0aW1lcyBiaW5kaW5nIiwgICAgDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgImJpbmRlbmQiKSB+ICJiaW5kaW5nIiwNCiAgICBUUlVFIH4gYWJzdGltbXVuZ3N0eXApKSAlPiUgDQogICAgc2VsZWN0KGJpbmRpbmduZXNzKSAlPiUgDQogICAgdGFibGUoKQ0KDQoNCnN1ZGRfZGF0ICU+JSANCiAgICAjIFR5cGU/DQogIG11dGF0ZSh0eXBlID0gY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJJbm9mZml6aWVsbGUgQWJzdGltbXVuZyIpIH4gImlub2ZmaWNpYWwiLA0KICAgIHN0cl9kZXRlY3QoYWJzdGltbXVuZ3N0eXAsICJQbGViaXN6aXQiKSB+ICJwbGVic2ljaXRlIiwgICAgDQogICAgc3RyX2RldGVjdChhYnN0aW1tdW5nc3R5cCwgIk9ibGlnYXRvcmlzY2giKSB+ICJvYmxpZ2F0b3J5IiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiRmFrdWx0YXRpdiIpIH4gIm5vbi1vYmxpZ2F0b3J5IiwNCiAgICBzdHJfZGV0ZWN0KGFic3RpbW11bmdzdHlwLCAiSW5pdGlhdGl2ZSIpIH4gImluaXRpYXRpdmUiLA0KICAgIFRSVUUgfiBhYnN0aW1tdW5nc3R5cCkpICU+JSANCiAgICBzZWxlY3QodHlwZSkgJT4lIA0KICAgIHRhYmxlKCkNCg0KDQpgYGANCg0KDQojIyMjIFRlc3QgaXQNCg0KYGBge3J9DQoNCg0KdGFibGVzdHlsZSA8LSByZWFkX2h0bWwoImh0dHBzOi8vd3d3LnN1ZGQuY2gvZXZlbnQucGhwP2xhbmc9ZGUmaWQ9YnowMTIwMTIiKSAlPiUgDQogIGh0bWxfbm9kZXMoInRhYmxlIikgJT4lIA0KICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAlPiUgDQogIC5bWzFdXSAlPiUgDQogIG11dGF0ZShYMSA9IGZpeF90aGVfc3RyaW5nKFgxKSkgJT4lIA0KICBtdXRhdGVfY29uZChjb25kaXRpb24gPSBYMSAlbmluJSBjKCJCZW1lcmt1bmdlbiIsICJRdWVsbGVuIiksIA0KICAgICAgICAgICAgICBYMiA9IGZpeF90aGVfc3RyaW5nKFgyKSkgJT4lIA0KICBtdXRhdGVfY29uZChjb25kaXRpb24gPSBYMSAlbmluJSBjKCJCZW1lcmt1bmdlbiIsICJRdWVsbGVuIiksIA0KICAgICAgICAgICAgICBYMyA9IGZpeF90aGVfc3RyaW5nKFgzKSkNCiMgDQojIHN0cmluZ2k6OnN0cmlfZW5jX2lzYXNjaWkodGFibGVzdHlsZSRYMSkNCiMgaXMuY2hhcmFjdGVyKHRhYmxlc3R5bGUkWDEpDQojIA0KIyBzdXBwcmVzc01lc3NhZ2VzKGR1cGxpY2F0ZXMgPC0gdGFibGVzdHlsZSAlPiUgDQojICAgamFuaXRvcjo6Z2V0X2R1cGVzKFgxKSkNCmxpYnJhcnkoc2ptaXNjKQ0KDQoNCnRhYmxlc3R5bGUNCnJvd25hbWVzKHRhYmxlc3R5bGUpIDwtIHRhYmxlc3R5bGUkWDEgDQoNCmZpbmFsX3RhYiA8LSB0YWJsZXN0eWxlICU+JSANCiAgZHBseXI6OnNlbGVjdCgtWDEsIC1YMykgJT4lIA0KICB0KCkgJT4lIA0KICBhc190aWJibGUoKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0Kc3RyaW5naTo6c3RyaV9lbmNfaXNhc2NpaSh0YWJsZXN0eWxlJFgyKQ0KDQpmaXhfdGhlX3N0cmluZyA8LSBmdW5jdGlvbihzdHJpbmcpIHsNCiAgc3RyaW5nIDwtIHRhYmxlc3R5bGUkWDINCiAgZGV0ZWN0IDwtIHN0cmluZ2k6OnN0cmlfZW5jX21hcmsoc3RyaW5nKSANCiAgdXRmOF9kZXQgPC0gaWZlbHNlKGRldGVjdCA9PSAiVVRGLTgiLCBULCBGKQ0KICBBU0NJSV9kZXQgPC0gaWZlbHNlKGRldGVjdCA9PSAiQVNDSUkiLCBULCBGKQ0KICANCiAgaWYgKEFTQ0lJX2RldCkNCiAgICANCiAgICBjYXNlX3doZW4oDQogICAgICBpZmVsc2UoZGV0ZWN0ID09ICJBU0NJSSIsIFQsIEYpIH4gICAsDQogICAgDQogICAgVFJVRSB+IHN0cmluZ1t1dGY4X2RldF0NCiAgICApDQogIA0KIHN0cmluZ1tBU0NJSV9kZXRdICU+JSAgIA0KICAgIGljb252KGZyb20gPSAiQVNDSUkiLCB0byA9ICJ1dGYtOCIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVtb3ZlX2FsbCgiYlwwMjRcMDI3YlwwMjRcMDAxICIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIkNcMDA0IiwgImFlIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiQ1xcJCIsICJhZSIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIkM8IiwgInVlIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiYlwwMDZcMDIyIiwgIi0iKQ0KICAgIA0KICBzdHJpbmdbdXRmOF9kZXRdICU+JSAgIA0KICAgIGljb252KGZyb20gPSAidXRmLTgiLCB0byA9ICJBU0NJSSIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVtb3ZlX2FsbCgiYlwwMjRcMDI3YlwwMjRcMDAxICIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIkNcMDA0IiwgImFlIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiQ1xcJCIsICJhZSIpICU+JSANCiAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIkM8IiwgInVlIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiYlwwMDZcMDIyIiwgIi0iKSAgDQogIA0KICBpZiAoYW55KHN0cmluZ2k6OnN0cmlfZW5jX21hcmsodGFibGVzdHlsZSRYMikpDQogIHRhYmxlc3R5bGUkWDIgJT4lICAgDQogICAgaWNvbnYoZnJvbSA9ICJBU0NJSSIsIHRvID0gInV0Zi04IikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZW1vdmVfYWxsKCJiXDAyNFwwMjdiXDAyNFwwMDEgIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiQ1wwMDQiLCAiYWUiKSAlPiUgDQogICAgc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKCJDXFwkIiwgImFlIikgJT4lIA0KICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCgiQzwiLCAidWUiKSAlPiUgDQogICAgc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKCJiXDAwNlwwMjIiLCAiLSIpICAgICANCn0NCmBgYA0KDQo=